\section{Modificaciones}
\subsection{Ambiguedad}

Partimos de la gramática del enunciado:
\begin{verbatim}
E -> EE
E -> E^E
E -> E_E
E -> E^E E
E -> E_E^E
E -> E/E
E -> (E)
E -> {E}
E -> l
\end{verbatim}

Esta gramática no es ELL(K): por empezar, no solo tiene recursión a izquierda, sino que además es ambigua: admite varios árboles de derivación para una misma cadena.

\begin{figure}[h!]
\centering
\includegraphics[scale=0.5]{arbol1.png}
\caption{Un árbol de derivación para la cadena 3$/$45}
\end{figure}

\begin{figure}[h!]
\centering
\includegraphics[scale=0.5]{arbol2.png}
\caption{Otro árbol de derivación para la cadena 3$/$4\textasciicircum5}
\end{figure}
La ambiguedad fue el primer problema que atacamos, utilizando las técnicas vistas en clase, teniendo en cuenta las reglas de asociatividad y precedencia del enunciado, transformamos esa gramática a la siguiente:

\begin{verbatim}
E -> E/A | A
A -> AB | B
B -> C^C | C_C | C^C_C | C
C -> (E) | {E} |l
\end{verbatim}

En esta gramática no hay ambiguedad ya que por como están hechas las reglas, forzamos que la división es la de menor precedencia, seguida por la concatenación y los subíndices/superíndices.

\begin{figure}[h!]
\centering
\includegraphics[scale=0.5]{arbol3.png}
\caption{El unico árbol de derivación para la cadena 3$/$4\textasciicircum5}
\end{figure}


%estaria bueno ejemplos de una cadena c varios arboles pal primero y otra c uno sola en este

De todas formas, esta gramática sigue sin ser LL(K): tiene recursión a izquierda.

\subsection{Notación extendida}

El siguiente paso fue expresar esta gramática utilizando la notación extendida:
\begin{verbatim}
E -> A (/ A)*
A -> B+
B -> C(^C)?(_C)? 
C -> (E) | {E} |l
\end{verbatim}

Luego de algunos cambios sintácticos y el agregado del EOF (y una regla adicional por una limitación de ANTLR), nos quedó esta gramática:

\begin{verbatim}
grammar gramAntlr;

z : e EOF;

e: a ('/' a)*;

a: b+;

b: c('^'c)?('_'c)?;

c: N | '('e')' | '{' e '}'; 

N :'0'..'9' | 'a'..'z' | 'A'..'Z' | '+' | '-';
\end{verbatim}

Al final de la gramática, aparece una regla que no aparecía antes. Esta es una regla del lexer (a diferencia de las otras, que son reglas del parser), que le dice al lexer, que cuando vea un caracter alfanumérico o mas o menos, lo reemplaze por el no terminal N, que vendría a ser el 'l' de las gramáticas anteriores.


A lo anterior, se le agregó la regla:
\begin{verbatim}
ESP   :   (' ' | '\t' | '\r'| '\n') {$channel=HIDDEN;};
\end{verbatim}

simplemente para que los espacios, enters y tabs fueran ignorados.

ANTLR genera por si sólo un arbol plano donde todos los nodos son hijos de un mismo nodo raiz.
Este tipo de arbol generado no nos es ultil para poder hacer el calculo de los atributos, es por esto que le hicimos una ulitma modificación a la gramatica 
para que ANTLR genere un arbol con la forma que nosotros queríamos.

Para esto usamos atributos en ANTLR y la gramatica quedo de esta forma:

\begin{verbatim}
x : e EOF!; 

e: a ('/'^ e)?;

a: b1=b(a1=a)?  -> {a1 != null}? ^(CONCAT $b1 $a1)
                -> b;

b: c1=c('^'c2=c)?('_'c3=c)? -> {c2 != null && c3 != null}? ^(INDICE $c1 $c2 $c3)
                            -> {c2 == null && c3 == null}? c
                            -> {c2 == null}? ^(INDICE $c1 VACIO $c3)
                            -> ^(INDICE $c1 $c2 VACIO); 

c: N | 
  '('e')' -> ^(PARENTESIS e) | 
  '{' e '}' -> e;

N :'0'..'9' | 'a'..'z' | 'A'..'Z' | '+' | '-' | '*';
\end{verbatim}

Se agregaron nodos imaginarios que representan las operaciones explicitas o implicitas (como por ejemplo CONCAT, que simboliza la operacion de concatenar).

En el caso de que la operacion sean explicitas se pueden tomar estas como Nodo y no es necesario crear un nodo imaginario. Este es el caso de la división.
Para esto se modifica la gramática de ANTLR agregandole un \'^\'. En el caso de que no nos interese la operacion (el caso de EOF) sacamos esta operacion como nodo,
en este caso de le agrega un \'!\'.

